package es.udc.fbellas.j2ee.tiendaweb.model.categoria.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import es.udc.fbellas.j2ee.tiendaweb.model.categoria.TO.CategoriaTO;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;

/**
 * An implementation of <code>SQLAccountDAO</code> for databases providing
 * counter columns with JDBC 3 drivers.
 */
public class SQLCategoriaDAO {

/* encontrar categoria a partir de identificador de la categoria */

    public CategoriaTO find(Connection connection, int idCategoria) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "SELECT IDCATEGORIA, NOMBRE FROM CATEGORIA" + " WHERE IDCATEGORIA = ?";
            preparedStatement = connection.prepareStatement(queryString);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, 
                idCategoria);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "No hay ninguna categoria con ese identificador."));
            }

			/* get result */
			i = 1;
			int id = resultSet.getInt(i++);
			String nombre = resultSet.getString(i++);


			return new CategoriaTO(id, nombre);
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
			GeneralOperations.closeResultSet(resultSet);
        }
        
    }

    
    public List<CategoriaTO> getCategorias(Connection connection) 
    throws InternalErrorException {
    
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    List<CategoriaTO> lista = new ArrayList<CategoriaTO>();
    try {
            
        /* Create "preparedStatement". */
        String queryString = "SELECT IDCATEGORIA, NOMBRE FROM CATEGORIA";
        preparedStatement = connection.prepareStatement(queryString);    
        
        /* Execute query. */
		resultSet = preparedStatement.executeQuery();
		
        if (!resultSet.next()) {
            throw new InternalErrorException(new SQLException(
                "No hay ninguna categoria con ese identificador."));
        }

		/* get result */
        int i = 1;
        int id;
        String nombre;
        while(resultSet.next()){
        	id = resultSet.getInt(i++);
        	nombre = resultSet.getString(i++);
        	lista.add(new CategoriaTO(id,nombre));
        }

		return lista;
    
    } catch (SQLException e) {
        throw new InternalErrorException(e);
    } finally {
        GeneralOperations.closeStatement(preparedStatement);
		GeneralOperations.closeResultSet(resultSet);
    }
    
}

/* encontrar categoria a partir de identificador de la categoria */

    public CategoriaTO findByNombre(Connection connection, String nombreCategoria) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "SELECT IDCATEGORIA, NOMBRE FROM CATEGORIA" + " WHERE NOMBRE = ?";
            preparedStatement = connection.prepareStatement(queryString);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setString(i++, 
                nombreCategoria);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "No hay ninguna categoria con ese nombre."));
            }

			/* get result */
			i = 1;
			int id = resultSet.getInt(i++);
			String nombre = resultSet.getString(i++);


			return new CategoriaTO(id, nombre);
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
			GeneralOperations.closeResultSet(resultSet);
        }
        
    }











    
    /* This class can by tested by "SQLAccountDAOFactory". */

}
